package com.vinfai.thread.tradition;
/**
 * 多线程的互斥与同步通信:
 * 子线程循环10次，再主线程循环100，又回到子线程循环10，再主线程循环100。
 * 如此循环50次。
 * @author vinfai
 *
 */
public class ThreadCommunication {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		final Block block= new Block();
		//主线程
		new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i=1;i<=50;i++){
					block.doMain(i);
				}
			}
		}).start();
		new Thread(new Runnable() {
			public void run() {
				for(int i=1;i<=50;i++){
					block.doSub(i);
				}
			}
		}).start();
		
	}
	
}
/**
 * 要用到共享数据（包括同步锁）的若干方法应归属到一个类上。高内聚、程序的健壮性
 * @author vinfai
 *
 */
class Block{
	boolean isSubTime  = true;//子线程先执行 
	
	//两个同步方法互斥.
	public synchronized void doSub(int j){
		while(!isSubTime){ // 最好使用while
			try {
				System.out.println("sub thread wait....");
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		for(int i=1;i<=10;i++){
			System.out.println("sub thread run time : "+i+" of loop :"+j);
		}
		isSubTime = false;
		this.notify();
	}
	
	public synchronized void doMain(int j){
		while(isSubTime){
			try {
				System.out.println("main thread wait....");
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		for(int i=1;i<=100;i++){
			System.out.println("main thread run time : "+i+" of loop :"+j);
		}
		isSubTime = true;
		this.notify();
	}
}
